﻿//================================================
//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//
//
//================================================
//
// Created by Huiyi on 2021/4/20.
//
//@模块名称 易炫彩编码库
//@依赖   module_base.h
//@版本   1.3
//@日期   2022-10-05
//@作者   Huiyi
//@模块备注 封装编码相关处理函数
//项目gitee地址 https://gitee.com/LoveA/XL_XExpand
//大部分代码已经历过粗略测试
//如发现BUG可提交issues
//https://gitee.com/LoveA/XL_XExpand/issues
//反馈QQ群:594165459

#pragma once

#ifndef XL_XEXPAND_CODING_H
//@隐藏{
#define XL_XEXPAND_CODING_H    //防止复用

#if XC_MOUDLE
#include "module_base.h"
#endif
//@隐藏}
#include <sstream>

//@src  "coding.cpp"
//@src  "base.cpp"

// TODO: 编码字节
//@分组{  编码字节


//@参数   宽文本字节指针
//@参数   代码页 [可空]
//@别名   编码_WToA(宽文本字节,代码页)
CXTextA X_Coding_WToA(const wchar_t* wp, size_t m_encode=CP_ACP);

//@参数   文本指针
//@参数   代码页
//@别名   编码_AToW(文本字节,代码页)
CXText X_Coding_AToW(const char* c, size_t m_encode = CP_ACP);

//@参数   文本指针
//@别名   编码_Utf8转Gbk(utf8文本)
CXTextA X_Coding_Utf82Gbk(const char* utf8);

//@参数   文本指针
//@别名   编码_Unicode转Utf8(Unicode)
CXTextA X_Coding_UnicodeToUtf8(const wchar_t* unicode);

//@参数   文本指针
//@别名   编码_GBK转Utf8(文本)
CXTextA X_Coding_GBKToUtf8(const char* str);

//@参数   待编码文本 如%u0031%u0032%u0033
//@参数   分隔符 如%
//@别名   编码_usc2到ansiA(待编码文本,分隔符)
CXTextA X_Coding_Usc2ToAnsiA(const CXTextA& instr, CXTextA separator="%");
//@参数   待编码文本 如%u0031%u0032%u0033
//@参数   分隔符 如%
//@别名   编码_usc2到ansi(待编码文本,分隔符)
CXText X_Coding_Usc2ToAnsi(const CXText& instr, CXText separator=L"%");

//@参数   待编码字符串 如:123
//@参数   分隔符 如%,返回%u0031%u0032%u0033
//@别名   编码_ansi到usc2(待编码文本,分隔符)
CXText X_Coding_AnsiToUsc2(const CXText& instr, CXText separator = L"%");
//@参数   待编码字符串 如:123
//@参数   分隔符 如%,返回%u0031%u0032%u0033
//@别名   编码_ansi到usc2A(待编码文本,分隔符)
CXTextA X_Coding_AnsiToUsc2A(const CXTextA& instr, CXTextA separator = "%");

//@参数   待编码文本 例如:炫彩IDE
//@参数   字符串分隔符 十六进制字符串间的分隔符,例如:","会返回 EC,C5,B2,CA,49,44,45
//@别名   编码_文本转十六进制文本(待编码文本,字符串分隔符)
CXText X_Coding_StringToHex(CXText& str, CXText separator = L"");
//@参数   待编码文本 例如:炫彩IDE
//@参数   字符串分隔符 十六进制字符串间的分隔符,例如:","会返回 EC,C5,B2,CA,49,44,45
//@别名   编码_文本转十六进制文本A(待编码文本,字符串分隔符)
CXTextA X_Coding_StringToHexA(CXTextA& str, CXTextA separator = "");

//@备注   宽字符与单字符在结果表现上并不一致!
//@别名   编码_十六进制文本转字符串(待编码文本)
CXText X_Coding_HexToString(CXText& str);
//@备注   宽字符与单字符在结果表现上并不一致!
//@别名   编码_十六进制文本转字符串A(待编码文本)
CXTextA X_Coding_HexToStringA(CXTextA& str);

//@别名 编码_URL编码A(待编码文本)
CXTextA X_Coding_UrlEncodeA(const CXTextA& str);
//@别名 编码_URL编码(待编码文本)
CXText X_Coding_UrlEncode(const CXText& str);

//@别名 编码_URL解码(待解码文本)
CXText X_Coding_UrlDecode(const CXText& str);
//@别名 编码_URL解码A(待解码文本)
CXTextA X_Coding_UrlDecodeA(const CXTextA& str);


//@分组}  编码字节
// TODO: 进制转换
//@分组{  进制转换

//@别名 进制_八到十(八进制值)
int X_Base_OctToDec(int octalNumber);
//@别名 进制_十到八进制(欲转换的值)
LONGLONG X_Base_DecToOct(LONGLONG num);

//@别名 进制_二到十(二进制文本)
double X_Base_BinToDec(const CXText& binStr);
//@别名 进制_二到十A(二进制文本)
double X_Base_BinToDecA(const CXTextA& binStr);

//@别名 进制_十到二(二进制数值)
CXText X_Base_DecToBin(double num);
//@别名 进制_十到二A(二进制数值)
CXTextA X_Base_DecToBinA(double num);

//@别名 进制_三十六到十(三十六进制文本)
LONGLONG X_Base_TsToDec(const CXText& str);
//@别名 进制_三十六到十A(三十六进制文本)
LONGLONG X_Base_TsToDecA(const CXTextA& str);

//@备注 可以将2到36进制的值转为10进制
//@参数 欲转换的值
//@参数 数值类型 2-36,空为自动识别,拥有0x前缀为16进制,否则默认10
//@别名 进制_到十进制A(欲转换的值,数值类型)
LONGLONG X_Base_ToDecA(const CXTextA& str, int base=0);
//@备注 可以将2到36进制的值转为10进制
//@参数 欲转换的值
//@参数 数值类型 2-36,空为自动识别,拥有0x前缀为16进制,否则默认10
//@别名 进制_到十进制(欲转换的值,数值类型)
LONGLONG X_Base_ToDec(const CXText& str, int base = 0);

//@别名 进制_十到八进制A(欲转换的值,目标进制)
CXTextA X_Base_DecToNA(LONGLONG num, int base = 10);
//@别名 进制_十到N进制(欲转换的值,目标进制)
CXText X_Base_DecToN(LONGLONG num, int base = 10);




//@分组}  进制转换

//@隐藏{
#ifndef XL_XEXPAND_XCLPTR
#define XL_XEXPAND_XCLPTR 
#ifdef _WIN64
typedef __int64 XCLPTR;
#else
typedef int XCLPTR;
#endif
#endif
//@隐藏}

#endif //XL_XEXPAND_CODING_H
